package top.lyunz.fangkeji.tools;

public class WanNianLi {

	/**
	 * 格式化输出日历
	 * 
	 * @param week:当前月份第一天的星期数
	 * @param year:当前年份
	 * @param month:当前月份
	 */
	public static int formatCalendarOutput(int year, int month) {
		int totalDays = getFromNowYearTo1900TotalDays(year);

		// 4、获得当前年份所经过的天数
		int totalDaysThisYear = getNowYearPassedTotalDays(year, month);

		// 5、求得给定月份第一天的星期数
		int week = (totalDays + totalDaysThisYear + 1) % 7;// 星期日是，week = 0

		// 6、格式化输出日历
		int cnt = 0;// 计数器，记录空白数和日期数的和
		int sum = 0;
		// 1) 打印表头
		// 2）打印空白（观察星期与之前空个数之间的规律）

		// 3) 打印日历
		for (int i = 1; i <= getNowMonthDays(year, month); i++) {
			cnt++;
			// 若记录空白数和日期数的和是七的倍数，应该换行输出
			sum++;

		}
		return sum;
	}

	/**
	 * 判断给定的年份是否为闰年
	 * 
	 * @param year:给定的年份
	 * @return true:闰年；false：平年
	 */
	public static boolean isLeapYear(int year) {
		return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
	}

	/**
	 * 根据参数指定的年份，月份，求出当前月的总天数
	 * 
	 * @param year:年份
	 * @param month:月份
	 * @return 月的总天数
	 */
	public static int getNowMonthDays(int year, int month) {// year:设计该参数的原因，2月份根据年份是否是闰年来确定其天数的
		switch (month) {
		case 2:
			return isLeapYear(year) ? 29 : 28;
		case 4:
		case 6:
		case 9:
		case 11:
			return 30;
		default:
			return 31;
		}
	}

	/**
	 * 获得当前年份的上一年距离1900年所经过的总天数
	 * 
	 * @param year 当前年份
	 * @return 总天数
	 */
	public static int getFromNowYearTo1900TotalDays(int year) {
		int totalDays = 0;
		for (int i = 1900; i < year; i++) {// i:年份
			totalDays += isLeapYear(i) ? 366 : 365;
		}
		return totalDays;
	}

	/**
	 * 求出当前年份经过的总天数（从当前年的1月1日到给定月份的上一个月最末一天）
	 * 
	 * @param year:年份
	 * @param month:月份
	 * @return 总天数
	 */
	public static int getNowYearPassedTotalDays(int year, int month) {
		int totalDays = 0;
		for (int i = 1; i < month; i++) {// i:月份
			totalDays += getNowMonthDays(year, i);
		}
		return totalDays;
	}

	public static int getweekDay(int y, int m, int d) {
		// TODO 自动生成的方法存根
		int zy = 0;// 年份天数
		int yy = 0;// 月份天数
		int year = y;
		int money = m;
		// 计算总天数
		for (int i = 1900; i < year; i++) {
			if (i / 400 == 0 || (i % 4 == 0 && i % 100 != 0)) {
				zy += 366;
			} else {
				zy += 365;
			}
		}
		// 计算月数
		for (int i = 1; i < money; i++) {
			switch (i) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				yy += 31;
				break;
			case 2:
				if (year / 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
					yy += 28;
				} else {
					yy += 29;
				}
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				yy += 30;
				break;

			}
		}
		int sum = zy + yy + d;
		return sum % 7;
	}
}
